package com.aoip.telemetry.telemetry.test.file;

import javax.imageio.stream.FileImageInputStream;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author chenbai
 * @version 1.0
 * @Description TODO
 * @date 2022/12/20 22:29
 */
public class FileReceive {

    public static void main(String[] args) {
        String filePath = "C:\\Users\\86159\\Pictures\\A_H\\a.jpg";
        byte[] bytes = imageToBytes(filePath);
        List<byte[]> list = splitBytes(bytes);
        System.out.println();
//        1、获取文件
//        2、将文件进行序列化，每1024个字节一个文件区间，
//        3、对每个文件区间进行crc校验码填充，
//        4、每个文件区间报文进行文件发送。
//        5、接收端进行文件确认，与响应信息发送。
//        6、解析端进行文件解析与文件合并。
//        7、文件合并后，对文件信息远程上传。
//        8、管理端进行文件查阅。
    }

    /**
     * 通过图片路径将图片文件转化为字符数组
     *
     * @param url 图片路径
     * @return byte[]
     */
    private static byte[] imageToBytes(String url) {
        FileImageInputStream input = null;
        ByteArrayOutputStream output = null;
        try {
            input = new FileImageInputStream(new File(url));
            output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            return output.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (output != null) {
                    output.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static List<byte[]> splitBytes(byte[] imageByte) {
        if (imageByte == null ) {
            return new ArrayList<>(0);
        }
        int length = imageByte.length;
        int capacity = length / 1024;
        int remainder = length % 1024;
        if (remainder > 0) {
            capacity = capacity + 1;
        }
        List<byte[]> imageByteList = new ArrayList<>(capacity);
        int beginIndex = 0;
        int surplus = length;
        int fixLength = 1024;
        while (surplus > 0) {
            if (surplus > fixLength) {
                imageByteList.add(Arrays.copyOfRange(imageByte, beginIndex, beginIndex + fixLength));
            } else {
                imageByteList.add(Arrays.copyOfRange(imageByte, beginIndex, length));
            }
            beginIndex = beginIndex + fixLength;
            surplus = surplus - fixLength;
        }
        return imageByteList;

    }
}
